package com.tedu.api.ee;

import org.junit.Test;

/**
 * java有一套完整处理异常操作：
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象
 *
 * Throwable顶级超类--抛出错误：
 * 子类：Exception对象：程序级别的错误（经常遇见）
 *            编译期--FileOutputStream（编写代码同时，下方波浪线）
 *            处理方式①：抛出异常，不管什么错误，抛出方法外
 *                  ②：捕获异常：抓到异常，记录异常错误信息
 *             检查异常：通常由编译器检查出来，存在异常类，抛出、捕获！
 *            运行期--控制台（IDE开发工具控制台，显示出红色，异常类名字）
 *            非检查异常：RuntimeException(认为所有异常来自于RuntimeException)
 *            所有异常都是RuntimeException的子类！
 * 子类：Error对象：描述系统级别的错误（不常见）
 *     ----测试程序挂了？ 利用字符串不断拼接---Error
 *     String str="字符串";直接量写出字符串---存常量值
 */
public class EE {
    /**
     * Error错误--递归方式栈溢出
     * 1.创建静态方法method
     * 2.在静态方法中调用 method
     * 3.通过testError单元测试--调用EE对象下的method方法
     *
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
       EE.method();
        }

    /**
     * 捕获异常语法
     * try{
     * 可能出现的异常代码段中添加
     * }catch(异常名字【小异常】e){
     * e.printStackTrace();打印异常信息--
     *                           方便开发者查询原因
     * }catch(异常名字【中异常】e){
     * e.printStackTrace();
     * }catch(异常名字【大异常】e){
     * 	e.printStackTrace();
     * 	}finally{
     * 	捕获异常--必须执行代码块--IO关闭流
     *
     * 	捕获异常快捷键ctrl+alt+t
     */
    @Test
    public void testException(){
    String s="a";

        try {
            //StringIndexOutOfBoundsException异常--字符串下标越界异常
            //异常产生原因:指定下标超出字符串范围!
            s.charAt(0);

            //NullPointerException异常---空指针异常
            //异常异常原因:字符串为空，拿到数据值为空时
            s.length();

            //NumberFormatException异常---数值转换异常
           //异常产生原因:将存储的不是整数的字符串，转换为整数!
            Integer.parseInt(s); //a 是整数类型
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }catch(NullPointerException e){
            e.printStackTrace();
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();
        } finally {
            System.out.println("一直执行代码块");
        }
    }
}